package com.hnucm.cooklife.base.utils;

import com.hnucm.cooklife.bean.db.DishDetail;
import com.hnucm.cooklife.bean.db.Test;
import com.hnucm.cooklife.bean.detail.DishDetailData;
import com.hnucm.cooklife.bean.detail.OriginData;
import com.hnucm.cooklife.bean.history.HistoryData;
import com.hnucm.cooklife.bean.home.ClassData;
import com.hnucm.cooklife.bean.home.DishData;
import com.hnucm.cooklife.bean.home.FollData;
import com.hnucm.cooklife.bean.me.LoginData;
import com.hnucm.cooklife.bean.me.MeCollectData;
import com.hnucm.cooklife.bean.me.MeData;
import com.hnucm.cooklife.bean.me.MyDishData;
import com.hnucm.cooklife.bean.me.RealDishData;
import com.hnucm.cooklife.bean.me.ToAddCollectData;
import com.hnucm.cooklife.bean.me.UserData;
import com.hnucm.cooklife.bean.order.OrderData;
import com.hnucm.cooklife.bean.order.OrderDetailData;
import com.hnucm.cooklife.bean.search.SearchData;
import com.hnucm.cooklife.bean.uploaddish.UpRece;

import java.util.List;
import java.util.Map;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.Url;

public interface ApiServer {

    //获取首页推荐菜谱
    @GET(Constant.DISH_URL)
    Observable<DishData> loadDish(@Path("currentPage") int currentPage);

    //获取我的菜谱
    @GET(Constant.MY_DISH_URL)
    Observable<MyDishData> loadMyDishColl(@Path("userId") int userId);

    //拿我的菜谱
    @GET(Constant.MY_POST_DISH_URL)
    Observable<RealDishData> loadRealMyDish(@Path("userid") int userid);

    //获取我的收藏
    @GET(Constant.MY_COLLECT_URL)
    Observable<MeCollectData> loadMyCollect(@Path("userId") int userId);

    //获取首页关注的人
    @GET(Constant.FOLL_URL)
    Observable<FollData> loadFoll(@Path("owner") int owner);

    //登录
    @POST(Constant.LOGIN_URL)
    Observable<LoginData> login(@Query("username") String username,@Query("password") String password);


    //收藏菜谱
    @POST(Constant.TO_COLLECT_URL)
    Observable<ToAddCollectData> addCollect(@Path("userId") int userId,@Path("dishId") int dishId);

    //取消收藏菜谱
    @POST(Constant.TO_UNCOLLECT_URL)
    Observable<ToAddCollectData> unCollect(@Path("userId") int userId,@Path("dishId") int dishId);


    //获取热词数据
    @GET(Constant.HOTKEY_URL)
    Observable<SearchData> loadSearch();
//
//    //获取详情页原料
//    @GET(Constant.ORIGIN_URL)
//    Observable<OriginData> loadOrigin(@Query("dishId") Integer dishId);

    //获取分类信息
    @GET(Constant.CLAS_URL)
    Observable<ClassData> loadClas();

    //获取商店信息
    @GET(Constant.ORDER_URL)
    Observable<OrderData> loadOrder();

    //获取商品详情
    @POST(Constant.ORDER_DETAIL_URL)
    Observable<OrderDetailData> loadOrderDetail(@Query("oId") Integer oId);

//    @GET
//    Call<ResponseBody> down(@Url String url);

    //获取菜谱详情页信息
    @POST(Constant.DISH_DETAIL_URL)
    Observable<DishDetailData> loadDishDetail(@Query("dishId") Integer dishId);

    //根据菜谱名获取菜谱信息

    /**
     * 配置header
     * 不然gson解析错误
     * Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
     */
    @Headers("Content-Type: application/json")
    @POST(Constant.DISH_RESULT)
    Observable<DishData> loadDishResult(@Path("currentPage") int currentPage,@Body Map<String,String> dishname);

    //根据用户id获取用户发布的作品
    @POST(Constant.MY_WORK_URL)
    Observable<MeData> loadWorks(@Path("userId") int userId);

    //根据用户id获取用户信息
    @GET(Constant.USER_URL)
    Observable<UserData> loadUser(@Path("userId") int userId);

    //更换背景图
    @Multipart
    //不要在这里自己设置header的contenttype
    /**
     * 不然：
     * the request was rejected because no multipart boundary was found
     */
    @POST(Constant.UPDATE_BG_URL)
    Observable<UserData> updateUserBg(@Part MultipartBody.Part uploadFile,  @Path("userId") int userId);

    @Multipart
    @POST(Constant.UPDATE_ICON_URL)
    Observable<UserData> updateUserIcon(@Part MultipartBody.Part uploadFile,@Path("userId") int userId);


    @Headers({"Content-type:application/json;charset=utf-8","Accept:application/json"})//需要添加touch
    @POST(Constant.UP_DISH_URL)
    Observable<UpRece> updateDish(@Body RequestBody dishDetail);

    @GET(Constant.HISTROY_URL)
    Observable<HistoryData> getHistroy(@Query("userId") int userId);

    @POST(Constant.UPDATE_HISTORY)
    Observable<UpRece> updateHistory(@Query("dishId") int dishId,@Query("userId") int userId);

//    @Multipart
//    @POST(Constant.UP_DISH_URL)
//    Observable<UpRece> updish(@PartMap Map<String, RequestBody> params);


    @Multipart
    @POST(Constant.UPLOAD_YUN)
    Call<String> registerUser(@Part MultipartBody.Part photo);


        @Multipart
        @POST(Constant.LOGIN_URL)  //这里是自己post文件的地址
        Observable<OrderData> postGoodsReturnPostEntitys(@PartMap Map<String, RequestBody> map, @Part List<MultipartBody.Part> parts);
}
